有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java正则表达式:在2个标记之间提取DNA信息

我想从文件中提取一些DNA信息。 在由碱基GCAT组成的DNA数据之前有一个单词ORIGIN,之后是一个//。如何编写正则表达式来获取这些标记之间的这些碱基

我试过以下方法,但不起作用

[ORIGIN(GCATgcat)////]

样本数据:

ORIGIN      
  1 acagatgaag acagatgaag acagatgaag acagatgaag
  2 acagatgaag acagatgaag acagatgaag acagatgaag
//

共 (2) 个答案

  1. # 1 楼答案

    尝试这种模式“\\b([GCATgcat]+)\\b”,它匹配任何由单词边界包围的GCAT字符序列(大写或小写)(因此它不会匹配嵌入其他字符串中的字符,比如单词“catalog”)。如果您在示例文件中反复扫描这个正则表达式,您将提取每个序列

    下面是一个示例文件:

    // Locate the substring between "ORIGIN" and "//" in the file.
    String fileContents = getSampleFileContents();
    int indexOfOrigin = fileContents.indexOf("ORIGIN");
    String pertinentSection = fileContents.substring(
        indexOfOrigin, fileContents.indexOf("//", indexOfOrigin));
    
    // Search for sequences within the pertinent substring.
    Pattern p = Pattern.compile("\\b([GCATgcat]+)\\b");
    Matcher m = p.matcher(pertinentSection);
    List<String> sequences = new ArrayList<String>();
    while (m.find()) {
      sequences.add(m.group(1));
    }
    sequences.toString(); // => ["acagatgaag", "acagatgaag", ..., "acagatgaag"]
    
  2. # 2 楼答案

    对于我们这些不是regex超级巫师的人,我建议采取两步走的方法。去掉明显的瑕疵,比如数字和换行符,然后进行匹配。e、 g

    public class Regex {
    
       static String NL = "\n";
       static String INPUT = "stuff at beginning ORIGIN" + NL + 
       "1 acagatgaag acagatgaag acagatgaag acagatgaag" + NL + NL + 
       "2 acagatgaag acagatgaag acagatgaag acagatgaag" + NL + 
       "// I added stuff here at the end that should be ignored";
    
       public static void main(String[] args) {
           Pattern removePattern = Pattern.compile("[\\r\\n \\t\\d]+");
           Pattern findPattern = Pattern.compile("ORIGIN[GCATgcat]+//");
    
           Matcher removeMatcher = removePattern.matcher(INPUT);
           String clean = removeMatcher.replaceAll("");
    
          Matcher findMatcher = findPattern.matcher(clean);
          if ( findMatcher.find()) {
             System.out.println(findMatcher.group());
          }
       }
    }